function countUnguarded(m, n, guards, walls) {
  // 初始化网格，false表示空格子
  const grid = Array.from({ length: m }, () => new Array(n).fill(false));

  // 标记警卫位置为true
  for (const [r, c] of guards) {
    grid[r][c] = true;
  }

  // 标记墙的位置为true
  for (const [r, c] of walls) {
    grid[r][c] = true;
  }

  // 初始化被保卫的格子集合
  const guarded = new Set();

  // 四个方向：上、右、下、左
  const dirs = [
    [-1, 0],
    [0, 1],
    [1, 0],
    [0, -1],
  ];

  // 处理每个警卫
  for (const [r, c] of guards) {
    for (const [dr, dc] of dirs) {
      let nr = r + dr;
      let nc = c + dc;
      // 沿着当前方向移动，直到出界或遇到警卫/墙
      while (nr >= 0 && nr < m && nc >= 0 && nc < n) {
        if (grid[nr][nc]) {
          break; // 遇到警卫或墙，停止
        }
        // 标记当前格子为被保卫
        guarded.add(nr * n + nc);
        // 继续向同一方向移动
        nr += dr;
        nc += dc;
      }
    }
  }

  // 计算结果：总格子数 - 特殊格子数（警卫+墙） - 被保卫的格子数
  return m * n - (guards.length + walls.length) - guarded.size;
}
